package br.com.imob.dao;

import br.com.imob.modelo.Cliente;

import java.util.List;

/**
 *
 * @author Gilton Nascimento
 */
public class ClienteDao extends GenericDao {

    public ClienteDao() {}

    public Integer adicionarCliente(Cliente cliente) {

//        Cliente c = retriveCliente(cliente);
//
//        if ( !c.getPessoa().equals( cliente.getPessoa() ) )
//            new PessoaDao().adicionarPessoa(cliente.getPessoa());

        saveOrUpdatePojo(cliente);
        return cliente.getClienteId();
    }

    public void removerCliente(Cliente cliente) {
        removerPojo(cliente);
    }

    /* Precisa definir o ID */
    public void atualizarCliente(Cliente recupera) {
        saveOrUpdatePojo(recupera);
    }
    
    
    /**
	 * Editar um Cliente
	 * @param String oldCliente
	 * @param String newCliente
	 */
	public void atualizarCliente(String tpStr, String oldCliente, String newCliente ) {
		
		if( "origem".equalsIgnoreCase(tpStr) ) {
			if ( ( !"".equalsIgnoreCase(oldCliente) && oldCliente != null )
					&& ( !"".equalsIgnoreCase(newCliente) && newCliente != null ) ) 
				atualizarCliente( getClienteQNamedOrigem(oldCliente), new Cliente(tpStr, newCliente) );
		}
		
		if( "pretensao".equalsIgnoreCase(tpStr) ) {
			if ( ( !"".equalsIgnoreCase(oldCliente) && oldCliente != null )
					&& ( !"".equalsIgnoreCase(newCliente) && newCliente != null ) ) 
				atualizarCliente( getClienteQNamedPretensao(oldCliente), new Cliente(tpStr, newCliente) );
		}
		if( "observacao".equalsIgnoreCase(tpStr) ) {
			if ( ( !"".equalsIgnoreCase(oldCliente) && oldCliente != null )
					&& ( !"".equalsIgnoreCase(newCliente) && newCliente != null ) ) 
				atualizarCliente( getClienteQNamedObservacao(oldCliente), new Cliente(tpStr, newCliente) );
		}
	}
    

    /* Precisa definir qual atribuito sera a chave a identificar
     * a tupla a ser alterada */
    public void atualizarCliente(Cliente recuperar, Cliente alterar) {
        recuperar = retriveCliente(recuperar);

//  Prazo
        if( alterar.getPrazo() != null )
            recuperar.setPrazo(alterar.getPrazo());
//  Origem
        if( alterar.getOrigem() != null )
            recuperar.setOrigem(alterar.getOrigem());
//  Pretensao
        if( alterar.getPretensao() != null )
            recuperar.setPretensao(alterar.getPretensao());
//  Investimento
        if( alterar.getInvestimento() != null )
            recuperar.setInvestimento(alterar.getInvestimento());
//  Item Negociado
        if( alterar.getItemNegociado() != null )
            recuperar.setItemNegociado(alterar.getItemNegociado());
//  Observacao
        if( alterar.getObservacao() != null )
            recuperar.setObservacao(alterar.getObservacao());
//  Finalidade
        if ( alterar.getFinalidade().getFinalidade() != null )
            recuperar.getFinalidade().setFinalidade(alterar.getFinalidade().getFinalidade());
//  Categoria
        if ( alterar.getFinalidade().getCategoria().getCategoria() != null ) 
            recuperar.getFinalidade().getCategoria().setCategoria(
                    alterar.getFinalidade().getCategoria().getCategoria());
//  Pessoa
        if ( !alterar.getPessoa().equals( recuperar.getPessoa() ) )
            recuperar.setPessoa( alterar.getPessoa() );
        
        saveOrUpdatePojo(recuperar);
    }

    /*Artificio para Recuperar a Tupla de Cliente*/
    protected Cliente retriveCliente(Cliente recuperar) {

        if ( recuperar.getPessoa().getPessoaId() == null )
            return null;
        else
            return getClienteByQuery("SELECT c FROM Cliente c1, Pessoa p WHERE "
                    + "c1.pessoa_id = " + recuperar.getPessoa().getPessoaId() );
    }

//	Consultas
    public Cliente getCliente(Integer key) {
        return getPojoByID(Cliente.class, key);
    }

    public Cliente getClienteByQuery(String query, Object... params) {
        return getPojoByQry(query, params);
    }

/* Find By Attributs */
//  Prazo
    public Cliente getClienteQNamedPrazo(String fltrPrazo) {
        return getPojoByQNamed("Cliente.findByPrazo", fltrPrazo);
    }
//  Origem
    public Cliente getClienteQNamedOrigem(String fltrOrigem) {
        return getPojoByQNamed("Cliente.findByOrigem", fltrOrigem);
    }
//  Pretensao
    public Cliente getClienteQNamedPretensao(String fltrPretensao) {
        return getPojoByQNamed("Cliente.findByPretensao", fltrPretensao);
    }
//  Investimento
    public Cliente getClienteQNamedInvestimento(String fltrInvestimento) {
        return getPojoByQNamed("Cliente.findByInvestimento", fltrInvestimento);
    }
//  Observacao
    public Cliente getClienteQNamedObservacao(String fltrObservao) {
    	return getPojoByQNamed("Cliente.findByObservacao", fltrObservao);
    }

    
    public Cliente getClienteByArg( int id, String tpStr, String arg ) {
    	String query = "SELECT c FROM Cliente WHERE clienteId = ? AND "+tpStr+" = "+arg;
    	return getClienteByQuery(query, id);
    }
    
    public List<Cliente> getClientes() {
        return (List<Cliente>) getALL(Cliente.class);
    }

/*  LIKES */
//  Origem
    public List<Cliente> getClientesQNamedOrigemPRX(String fltrOrigem) {
        return getListByQNamedPRX("Cliente.findLikeByOrigem", fltrOrigem);
    }
//  Pretensao
    public List<Cliente> getClientesQNamedPretensaoPRX(String fltrPretensao) {
        return getListByQNamedPRX("Cliente.findLikeByPretensao", fltrPretensao);
    }
//  ItemNegociado
    public List<Cliente> getClientesQNamedItemNegociadoPRX(String fltrItemNegociado) {
        return getListByQNamedPRX("Cliente.findLikeByItemNegociado", fltrItemNegociado);
    }
//  Observacao
    public List<Cliente> getClientesQNamedObservacaoPRX(String fltrObservacao) {
    	return getListByQNamedPRX("Cliente.findLikeByObservacao", fltrObservacao);
    }
/* Fim dos Likes */


//LISTAS
//  Prazo
    public List<Cliente> getPessoasQNamedPrazo(String fltrPrazo) {
        return getListByQNamed("Pessoa.findByPrazo", fltrPrazo);
    }
//  Investimento
    public List<Cliente> getPessoasQNamedInvestimento(String fltrInvest) {
        return getListByQNamed("Pessoa.findByInvestimento", fltrInvest);
    }


    /*
    public List<Cliente> getClientesQNamedAllPRX(String fltrCliente, String fltrLoteamento,
            String fltrComplemento, String fltrReferencia) {
        List<Cliente> itensCliente = getClientesQNamedClientePRX(fltrCliente);
        List<Cliente> itensComplemento = getClientesQNamedComplementoPRX(fltrComplemento);

        HashSet<Cliente> itens = new HashSet<Cliente>();

        itensCliente.addAll(itensComplemento);
        itens.addAll(itensCliente);
        itensCliente.clear();

        itensCliente.addAll(itens);
        return itensCliente;
    }
    */

    public List<Cliente> getClientesByQuery(String query, Object... params) {
        return getListByQry(query, params);
    }
}
